/* SQUIB - Scala's Quirky User Interface Builder 
 Copyright (C) 2008 Tim Dalton

 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

import scala.collection.mutable.{HashMap}
    
package tfd.scala.squib {

    import java.awt.Component
    import java.awt.event.{MouseEvent, MouseListener}
    import java.util.EventObject

    trait FiresMouseEvents[T <: {  def addMouseListener(ml:MouseListener) }] { self:FiresEventObjects with IdableTrait =>
        self.eventHandlers += (mouseEvents _).asInstanceOf[(Object, HashMap[String, EventObject => Unit]) => Unit]

        def mouseEvents(comp: T, events:HashMap[String, EventObject => Unit]):T = {
            val handler = new DelegateMouseEventHandler(events);
            if (handler.hasEvents) {
                comp.addMouseListener(handler)
            }
            comp
        }
   
        class DelegateMouseEventHandler(events: HashMap[String, EventObject => Unit]) extends MouseListener {
            private val mouseEnteredDelegate:Option[MouseEvent => Unit] = events.get("mouseentered");
            private val mouseExitedDelegate:Option[MouseEvent => Unit] = events.get("mouseexited");
            private val mouseClickedDelegate:Option[MouseEvent => Unit] = events.get("mouseclicked");
            private val mousePressedDelegate:Option[MouseEvent => Unit] = events.get("mousepressed");
            private val mouseReleasedDelegate:Option[MouseEvent => Unit] = events.get("mousereleased");
    
            lazy val hasEvents = !(mouseEnteredDelegate.isEmpty
                                   && mouseExitedDelegate.isEmpty
                                   && mouseClickedDelegate.isEmpty
                                   && mousePressedDelegate.isEmpty
                                   && mouseReleasedDelegate.isEmpty)
            
            override def mouseEntered(me: MouseEvent) {
                if (!mouseEnteredDelegate.isEmpty) mouseEnteredDelegate.get.apply(me)
            }
    
            override def mouseExited(me: MouseEvent) {
                if (!mouseExitedDelegate.isEmpty) mouseExitedDelegate.get.apply(me)
            }
    
            override def mouseClicked(me: MouseEvent) {
                if (!mouseClickedDelegate.isEmpty) mouseClickedDelegate.get.apply(me)
            }
    
            override def mousePressed(me: MouseEvent) {
                if (!mousePressedDelegate.isEmpty) mousePressedDelegate.get.apply(me)
            }
    
            override def mouseReleased(me: MouseEvent) {
                if (!mouseReleasedDelegate.isEmpty) mouseReleasedDelegate.get.apply(me)
            }
        }
    }
}
